import { ITerminalOptions as IXtermTerminalOptions } from '@xterm/xterm';

import { IDisposable, OperatingSystem } from '../../utils';

import { ITerminalConnection } from './client';
import { ITerminalError } from './error';
import { ITerminalProfile } from './profile';
import { IShellLaunchConfig } from './pty';
import { IXTerm } from './xterm';

// 终端进程退出事件接口
export interface IPtyExitEvent {
  sessionId: string; // 会话唯一标识
  code?: number; // 退出码
  signal?: number; // 终止信号
}

// 终端进程名称变更事件接口
export interface IPtyProcessChangeEvent {
  sessionId: string; // 会话唯一标识
  processName: string; // 进程名称
}

// 终端服务接口
export interface ITerminalService {
  /**
   * 生成 sessionId
   */
  generateSessionId(): Promise<string>;

  /**
   * Xterm 终端的构造选项
   * 默认返回为 {}
   */
  getOptions?(): IXtermTerminalOptions;

  /**
   * 检测还在会话中的终端后台是否还处于保活状态，
   * 默认返回为 true
   *
   * @param sessionIds
   */
  check?(sessionIds: string[]): Promise<boolean>;

  /**
   * 通过启动配置创建并附加终端
   * @param sessionId 会话唯一标识
   * @param rows 终端初始化使用的列数
   * @param cols 终端初始化使用的行数
   * @param launchConfig 创建一个新终端的进程选项
   * @param xterm 创建的 xterm 实例
   */
  attachByLaunchConfig(
    sessionId: string,
    cols: number,
    rows: number,
    launchConfig: IShellLaunchConfig
    // xterm?: IXTerm
  ): Promise<ITerminalConnection | undefined>;

  /**
   * 发送文本到终端
   * @param id 会话唯一标识
   * @param message 发送的字符串信息
   */
  sendText(id: string, message: string | ArrayBuffer): Promise<void>;

  /**
   * 调整终端尺寸
   * @param sessionId 会话唯一标识
   * @param cols resize 的列数
   * @param rows resize 的行数
   */
  resize(sessionId: string, cols: number, rows: number): Promise<void>;

  /**
   * 销毁一个终端进程
   *
   * @param sessionId 会话唯一标识
   */
  disposeById(sessionId: string): void;

  /**
   * 异步向后端获取一个会话的进程 id
   *
   * @param sessionId 会话唯一标识
   */
  getProcessId(sessionId: string): Promise<number | undefined>;

  /**
   * 报错处理的事件
   *
   * @param handler
   */
  onError(handler: (error: ITerminalError) => void): IDisposable;

  /**
   * 终端正常退出
   *
   * @param sessionid
   */
  onExit(handler: (event: IPtyExitEvent) => void): IDisposable;

  // 进程名称变更事件
  onProcessChange(
    handler: (event: IPtyProcessChangeEvent) => void
  ): IDisposable;

  /**
   * 返回终端环境的 OS
   */
  getOS(): Promise<OperatingSystem>;

  /**
   * 获取默认系统 shell 路径
   */
  getDefaultSystemShell(): Promise<string>;

  /**
   * 获取 code 平台 key
   */
  getCodePlatformKey(): Promise<'osx' | 'windows' | 'linux'>;

  /**
   * 获取当前终端的工作目录
   * @param sessionId 会话唯一标识
   */
  getCwd(sessionId: string): Promise<string | undefined>;
}

// 终端内部服务接口，继承自 ITerminalService
export interface ITerminalInternalService extends ITerminalService {
  generateSessionId(): Promise<string>;

  getOptions(): IXtermTerminalOptions;

  check(sessionIds: string[]): Promise<boolean>;
}
